home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / サンプル実用編 / 小遣い帳 / CSESE.C < prev    next >
Text File  |  1994-03-10  |  19KB  |  591 lines

  1. /******************************************************************************
  2.  *    csese.c:    日付入力用疑似ダイアログ関数モジュール
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <stdio.h>
  7. #include <ctype.h>
  8. #include <string.h>
  9. #include <sxmemory.h>        /* メモリマンを利用するときに必要    */
  10. #include <console.h>        /* コンソール系マネージャを利用するときに必要 */
  11. #include <event.h>        /* イベントマンを利用するときに必要    */
  12. #include <sxgraph.h>        /* グラフマンを利用するときに必要    */
  13. #include <control.h>        /* コントロールマンを利用するときに必要    */
  14. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  15. #include <text.h>        /* テキストマンを利用するときに必要    */
  16. #include <task.h>        /* タスクマンを利用するときに必要    */
  17. #include "cash.h"        /* このプログラム固有のヘッダファイル    */
  18.  
  19. short funcKeyTbl[] = {            /* ファンクションキーアサインテーブル */
  20.     K_HOME,  0,            /* [HOME]    */
  21.     K_DEL,   0x07,            /* [DEL]    */
  22.     K_RUP,   0x03,            /* [ROLL UP]    */
  23.     K_RDOWN, 0x12,            /* [ROLL DOWN]    */
  24.     K_UNDO,  0,            /* [UNDO]    */
  25.     K_LEFT,  0x13,            /* [←]        */
  26.     K_UP,    0x05,            /* [↑]        */
  27.     K_RIGHT, 0x04,            /* [→]        */
  28.     K_DOWN,  0x18,            /* [↓]        */
  29.     K_CLR,   0,            /* [CLR]    */
  30.     K_HELP,  0,            /* [HELP]    */
  31.     K_INS,   0,            /* [INS]    */
  32.     0, 0                /* テーブル終端    */
  33. };
  34.  
  35. /******************************************************************************
  36.  *    openEseDlg():    疑似ダイアログのオープン
  37.  ******************************************************************************
  38.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  39.  *        Window *winPtr    ウィンドウポインタ
  40.  *        char *title    ダイアログタイトルへのポインタ
  41.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  42.  *                = FALSE: 作成失敗
  43.  *    注釈:
  44.  *    疑似ダイアログのワークを初期化する。
  45.  *    疑似ダイアログの表示はshowEseDlg()で行う。
  46.  */
  47. BOOLEAN openEseDlg(EseDlg *pese, Window *winPtr, char *title)
  48. {
  49.     /* 疑似ダイアログの各種座標 */
  50.     static Rect rcFrame = {        /* 外枠                */
  51.         ESE_X + 0, ESE_Y + 0, ESE_X + 221, ESE_Y + 94
  52.     };
  53.     static Rect rcText = {        /* テキスト入力欄(1)        */
  54.         ESE_X + 14, ESE_Y + 30, ESE_X + 42, ESE_Y + 48
  55.     };
  56.     static Rect rcText2 = {        /* テキスト入力欄(2)        */
  57.         ESE_X + 64, ESE_Y + 30, ESE_X + 92, ESE_Y + 48
  58.     };
  59.     static Rect rcPart = {        /* 文字ボタンのパーティション    */
  60.         ESE_X + 118, ESE_Y + 47, ESE_X + 201, ESE_Y + 77
  61.     };
  62.     /* ダイアログタイトルの表示位置 */
  63.     static Point ttlPos = { ESE_X + 15, ESE_Y + 15 };
  64.     static Point esettlPos21 = { ESE_X + 45, ESE_Y + 33 }; /* '月'    */
  65.     static Point esettlPos22 = { ESE_X + 95, ESE_Y + 33 }; /* '日'    */
  66.  
  67.     pese->windowPtr = winPtr;
  68.     pese->rcFrame = rcFrame;    /* 外枠レクタングルの登録    */
  69.     pese->rcText[0] = rcText;    /* テキスト用のレクタングル    */
  70.     pese->rcText[1] = rcText2;
  71.     pese->rcDest = rcText;
  72.     pese->rcPart = rcPart;        /* 文字ボタンのパーティション    */
  73.     pese->ttlPos = ttlPos;        /* タイトル表示座標        */
  74.     pese->ttlPos2[0] = esettlPos21;
  75.     pese->ttlPos2[1] = esettlPos22;
  76.     pese->tmode = 0;
  77.     pese->visible = 0;
  78.     *pese->tBuff[0] = 0;        /* 文字列の初期化        */
  79.     *pese->tBuff[1] = 0;
  80.  
  81.     pese->title = MMChHdlNew(256);    /* タイトル文字列用ハンドルを確保する */
  82.     if (pese->title == NULL)
  83.         return FALSE;
  84.  
  85.     strcpy(*pese->title, title);    /* タイトルを設定する        */
  86.     if (!createEseText(pese))    /* テキストエディットを作成する    */
  87.         return FALSE;
  88.  
  89.     if (!createEseControl(pese))    /* コントロールを作成する    */
  90.         return FALSE;
  91.  
  92.     return TRUE;
  93. }
  94.  
  95. /******************************************************************************
  96.  *    closeEseDlg():    疑似ダイアログのクローズ
  97.  ******************************************************************************
  98.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  99.  *    注釈:
  100.  *    疑似ダイアログを消去し、確保しているコントロールハンドルなど、すべて廃
  101.  *    棄します。
  102.  */
  103. void closeEseDlg(EseDlg *pese)
  104. {
  105.     int lastFC, lastAP;
  106.  
  107.     if (pese->visible) {
  108.         GMSetGraph(&pese->windowPtr->graph);
  109.         /* アクセスページを0と1ページにする */
  110.         lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  111.         lastFC = GMForeColor(G_LGRAY);
  112.         releaseClip(pese->windowPtr);
  113.         GMFillRect(&pese->rcFrame);
  114.         addUpdate(pese->windowPtr, &pese->rcFrame);
  115.         GMAPage(lastAP);
  116.         GMForeColor(lastFC);
  117.     }
  118.     if (pese->tEdit != NULL) {
  119.         /* テキストエディットハンドルを廃棄する */
  120.         TMDispose(pese->tEdit);
  121.         pese->tEdit = NULL;
  122.     }
  123.     if (pese->execBtnHdl != NULL) {
  124.         CMDispose(pese->execBtnHdl);
  125.         pese->execBtnHdl = NULL;
  126.     }
  127.     if (pese->canBtnHdl != NULL) {
  128.         CMDispose(pese->canBtnHdl);
  129.         pese->canBtnHdl = NULL;
  130.     }
  131.     MMHdlDispose(pese->title);    /* ハンドルを解放する        */
  132.     pese->title = NULL;
  133. }
  134.  
  135. /******************************************************************************
  136.  *    drawEseDlg():    疑似ダイアログの描画
  137.  ******************************************************************************
  138.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  139.  */
  140. void drawEseDlg(EseDlg *pese)
  141. {
  142.     int lastAP, lastFC, lastBC, lastFK;
  143.     int mode;
  144.     Point pt;
  145.     char str[16];
  146.  
  147.     if (!pese->visible)        /* 表示されていないか?        */
  148.         return;
  149.  
  150.     GMSetGraph(&pese->windowPtr->graph);
  151.     releaseClip(pese->windowPtr);
  152.     /* アクセスページを0と1ページにする */
  153.     lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  154.     lastFC = GMForeColor(G_BLACK);
  155.     lastBC = GMBackColor(G_LGRAY);
  156.     lastFK = GMFontKind(G_ROM12);
  157.  
  158.     GMScrewRect(&pese->rcFrame);    /* ネジ付レクタングルを表示する    */
  159.     GMShadowRect(&pese->rcPart);
  160.     CMDrawOne(pese->execBtnHdl);    /* ボタンを描画する        */
  161.     CMDrawOne(pese->canBtnHdl);
  162.     MMHdlLock(pese->title);
  163.     GMShadowStrZ(*pese->title, pese->ttlPos.x_y); /* ボタンを描画する */
  164.     MMHdlUnlock(pese->title);
  165.     /* 編集モードによる切り替え */
  166.     GMShadowStrZ("月", pese->ttlPos2[0].x_y);
  167.     GMShadowStrZ("日", pese->ttlPos2[1].x_y);
  168.  
  169.     /* テキスト領域の描画 */
  170.     GMBackColor(G_WHITE);
  171.     GMShadowRect(&pese->rcText[0]);
  172.     GMShadowRect(&pese->rcText[1]);
  173.     /* 表示文字列と、表示座標を選択する */
  174.     mode = 1 - pese->tmode;
  175.     sprintf(str, "%3d\0", pese->value[mode]);
  176.     pt.x_y = pese->rcText[mode].l.l_t;
  177.     pt.p.x += 3;
  178.     pt.p.y += 3;
  179.     GMMove(pt.x_y);
  180.     GMDrawStrZ(str);
  181.     /* テキストエディットの文字列を描画する */
  182.     TMUpDate(pese->tEdit, &pese->rcDest);
  183.  
  184.     GMAPage(lastAP);
  185.     GMForeColor(lastFC);
  186.     GMBackColor(lastBC);
  187.     GMFontKind(lastFK);
  188.     setClip(pese->windowPtr, &pese->rcFrame);
  189. }
  190.  
  191. /******************************************************************************
  192.  *    showEseDlg():    疑似ダイアログの表示
  193.  ******************************************************************************
  194.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  195.  */
  196. void showEseDlg(EseDlg *pese)
  197. {
  198.     int lastFC, lastAP;
  199.  
  200.     if (pese->visible)
  201.         return;
  202.  
  203.     GMSetGraph(&pese->windowPtr->graph);
  204.     releaseClip(pese->windowPtr);
  205.     /* アクセスページを0と1ページにする */
  206.     lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  207.     lastFC = GMForeColor(G_LGRAY);
  208.  
  209.     GMPenHide();
  210.     CMShow(pese->execBtnHdl);
  211.     CMShow(pese->canBtnHdl);
  212.     GMPenShow();
  213.  
  214.     pese->visible = TRUE;
  215.     moveEdit(pese, 0);        /* 1番目の入力項目を編集可能にする */
  216.     /* 全範囲指定の状態にする */
  217.     TMSetSelect(pese->tEdit, 0, (*pese->tEdit)->length, 0);
  218.     TMShow(pese->tEdit);
  219.  
  220.     GMAPage(lastAP);
  221.     GMForeColor(lastFC);
  222.  
  223.     /* アップデートリージョンに登録する */
  224.     addUpdate(pese->windowPtr, &pese->rcFrame);
  225.     setClip(pese->windowPtr, &pese->rcFrame);
  226. }
  227.  
  228. /******************************************************************************
  229.  *    hideEseDlg():    疑似ダイアログの消去
  230.  ******************************************************************************
  231.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  232.  */
  233. void hideEseDlg(EseDlg *pese)
  234. {
  235.     int lastFC, lastAP;
  236.  
  237.     if (!pese->visible)        /* 表示されていないか?        */
  238.         return;
  239.  
  240.     GMSetGraph(&pese->windowPtr->graph);
  241.     /* アクセスページを0と1ページにする */
  242.     lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  243.     lastFC = GMForeColor(G_LGRAY);
  244.  
  245.     releaseClip(pese->windowPtr);
  246.     pese->visible = FALSE;
  247.     CMHide(pese->execBtnHdl);
  248.     CMHide(pese->canBtnHdl);
  249.     TMHide(pese->tEdit);
  250.     GMFillRect(&pese->rcFrame);
  251.     addUpdate(pese->windowPtr, &pese->rcFrame);
  252.  
  253.     GMAPage(lastAP);
  254.     GMForeColor(lastFC);
  255. }
  256.  
  257. /******************************************************************************
  258.  *    createEseText():    疑似ダイアログ用テキストエディットの作成
  259.  ******************************************************************************
  260.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  261.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  262.  *                = FALSE: 作成失敗
  263.  */
  264. BOOLEAN createEseText(EseDlg *pese)
  265. {
  266.     int errCode;
  267.  
  268.     /* テキスト用ディスティネーションレクタングルを作成する */
  269.     pese->rcDest.d.left += 3;
  270.     pese->rcDest.d.top += 3;
  271.     pese->rcDest.d.right -= 3;
  272.     pese->rcDest.d.bottom -= 3;
  273.  
  274.     errCode = TMNew2(&pese->rcDest, &pese->rcDest, &pese->windowPtr->graph, &pese->tEdit);
  275.     if (errCode < 0)
  276.         /* テキストエディットが作成できなかった */
  277.         return FALSE;
  278.  
  279.     (*pese->tEdit)->lenMax = 3;    /* 入力最大文字数を設定する    */
  280.     (*pese->tEdit)->lineHeight = T_LHEIGHT; /* 改行幅を設定する    */
  281.     (*pese->tEdit)->editMode = 0;    /* 編集モードを通常表示にする    */
  282.     /* ファンクションキーアサインテーブルを設定する */
  283.     (*pese->tEdit)->funcCode = funcKeyTbl;
  284.  
  285.     return TRUE;
  286. }
  287.  
  288. /******************************************************************************
  289.  *    createEseControl():    疑似ダイアログ上のコントロールの作成
  290.  ******************************************************************************
  291.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  292.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  293.  *                = FALSE: 作成失敗
  294.  */
  295. BOOLEAN createEseControl(EseDlg *pese)
  296. {
  297.     static Rect rcExecBtn = {    /* [実行]ボタン            */
  298.         ESE_X + 124, ESE_Y + 53, ESE_X + 154, ESE_Y + 72
  299.     };
  300.     static Rect rcCanBtn = {    /* [取消]ボタン            */
  301.         ESE_X + 166, ESE_Y + 53, ESE_X + 196, ESE_Y + 72
  302.     };
  303.  
  304.     pese->execBtnHdl = CMOpen(pese->windowPtr, &rcExecBtn,
  305.         (_LASCII)"\x04実行", FALSE, 0, 0, 1, CI_CHRBTN << 4, 0);
  306.     if (pese->execBtnHdl == NULL)
  307.         return FALSE;
  308.  
  309.     pese->canBtnHdl = CMOpen(pese->windowPtr, &rcCanBtn,
  310.         (_LASCII)"\x04取消", FALSE, 0, 0, 1, CI_CHRBTN << 4, 0);
  311.     if (pese->canBtnHdl == NULL)
  312.         return FALSE;
  313.  
  314.     return TRUE;
  315. }
  316.  
  317. /******************************************************************************
  318.  *    caretEseDlg():    疑似ダイアログのカーソル制御
  319.  ******************************************************************************
  320.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  321.  *        BOOLEAN sw    = TRUE:  表示
  322.  *                = FALSE: 消去
  323.  */
  324. void caretEseDlg(EseDlg *pese, BOOLEAN sw)
  325. {
  326.     int lastAP, lastFC, lastBC, lastFK;
  327.  
  328.     if (!pese->visible)        /* 表示されていないか?        */
  329.         return;
  330.  
  331.     GMSetGraph(&pese->windowPtr->graph);
  332.     releaseClip(pese->windowPtr);    /* クリッピングを解除する    */
  333.     /* アクセスページを0と1ページにする */
  334.     lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  335.     lastFC = GMForeColor(G_BLACK);
  336.     lastBC = GMBackColor(G_WHITE);
  337.     lastFK = GMFontKind(G_ROM12);
  338.  
  339.     TMCaret(pese->tEdit, sw);    /* カーソルをオン/オフする    */
  340.  
  341.     GMAPage(lastAP);
  342.     GMForeColor(lastFC);
  343.     GMBackColor(lastBC);
  344.     GMFontKind(lastFK);
  345.     setClip(pese->windowPtr, &pese->rcFrame); /* クリッピングを戻す    */
  346. }
  347.  
  348. /******************************************************************************
  349.  *    eseDlgEvent():    イベントに応じた処理
  350.  ******************************************************************************
  351.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  352.  *        TsEvent *ptsev    タスクマンイベントレコードへのポインタ
  353.  *    戻り値:    int num        = 1: [実行]ボタン
  354.  *                = 2: [取消]ボタン
  355.  */
  356. int eseDlgEvent(EseDlg *pese, TsEvent *ptsev)
  357. {
  358.     int lastAP, lastFC, lastBC, lastFK;
  359.     int keyCode;            /* キーコード            */
  360.     int shortCut;            /* ショートカットキー        */
  361.     int num = 0, len;
  362.     int partCode;            /* コントロールのパートコード    */
  363.     LPoint lpt;
  364.     Control **ctrlHdl;        /* コントロールハンドル        */
  365.  
  366.     if (!pese->visible)        /* 表示されていないか?        */
  367.         return 0;
  368.  
  369.     GMSetGraph(&pese->windowPtr->graph);
  370.     releaseClip(pese->windowPtr);
  371.     /* アクセスページを0と1ページにする */
  372.     lastAP = GMAPage(G_PAGE0 | G_PAGE1);
  373.     lastFC = GMForeColor(G_BLACK);
  374.     lastBC = GMBackColor(G_WHITE);
  375.     lastFK = GMFontKind(G_ROM12);
  376.  
  377.     switch (ptsev->ts.what) {
  378.     case E_IDLE:            /* アイドルイベント        */
  379.         TMEventW(pese->tEdit, ptsev); /* カーソルを点滅させる    */
  380.         break;
  381.     case E_KEYDOWN:            /* キーダウンイベント        */
  382.         /* ファンクションアサインテーブルによりキーコードを変換する */
  383.         keyCode = TMKeyToAsk(pese->tEdit, ptsev);
  384.         if (keyCode == -2) {    /* テーブルに登録されてないか?    */
  385.             /* OPT.1キーが押されたか? */
  386.             if (ptsev->ev.how & KS_OPT1) {
  387.                 /* キー入力した文字を大文字に変換する */
  388.                 shortCut = toupper((int) ptsev->ev.whom.key.ascii);
  389.                 switch (shortCut) {
  390.                 case 'Q':    /* 終了            */
  391.                     num = 2; /* [取消]ボタン    */
  392.                     break;
  393.                 default:
  394.                     /* テキストマンのショートカットに
  395.                        対応する */
  396.                     TMEventW(pese->tEdit, ptsev);
  397.                     break;
  398.                 }
  399.             } else {
  400.                 switch (ptsev->ev.whom.key.ascii) {
  401.                 case '\r':    /* リターンキーかENTERキー */
  402.                     if (pese->tmode == 0)
  403.                         moveEdit(pese, 1);
  404.                     else {
  405.                         moveEdit(pese, 1);
  406.                         num = 1; /* [実行]ボタン */
  407.                     }
  408.                     break;
  409.                 case '\x1b':    /* ESCキー        */
  410.                     num = 2; /* [取消]ボタン    */
  411.                     break;
  412.                 default:    /* その他のキー        */
  413.                     TMEventW(pese->tEdit, ptsev);
  414.                     break;
  415.                 }
  416.             }
  417.         } else
  418.             /* その他のキーの場合 */
  419.             TMEventW(pese->tEdit, ptsev);
  420.         break;
  421.     case E_MSLDOWN:            /* マウスレフトダウンイベント    */
  422.         /* ダイアログより外の座標は、チェックしない */
  423.         lpt = GMGlobalToLocal(ptsev->ev.where.x_y);
  424.         if (GMPtInRect(&pese->rcFrame, lpt)) {
  425.             partCode = CMFind(lpt, pese->windowPtr, &ctrlHdl);
  426.             /* [実行]ボタンが押されたか? */
  427.             if (ctrlHdl == pese->execBtnHdl) {
  428.                 if (CMCheck(ctrlHdl, lpt, NULL) == C_INBTTN) {
  429.                     /* 現在の編集文字列を待避 */
  430.                     len = TMGetText(pese->tEdit, pese->tBuff[pese->tmode], 3);
  431.                     pese->tBuff[pese->tmode][len] = 0;
  432.                     num = 1; /* [実行]ボタン    */
  433.                 }
  434.             /* [取消]ボタンが押されたか? */
  435.             } else if (ctrlHdl == pese->canBtnHdl) {
  436.                 if (CMCheck(ctrlHdl, lpt, NULL) == C_INBTTN)
  437.                     num = 2; /* [取消]ボタン    */
  438.             } else if (GMPtInRect(&pese->rcDest, lpt))
  439.                 /* 編集領域内にポインタがある */
  440.                 TMEventW(pese->tEdit, ptsev);
  441.             else if (GMPtInRect(&pese->rcText[0], lpt))
  442.                 moveEdit(pese, 0);
  443.             else if (GMPtInRect(&pese->rcText[1], lpt))
  444.                 moveEdit(pese, 1);
  445.         }
  446.         break;
  447.     case E_MSRDOWN:            /* マウスライトダウンイベント    */
  448.         TMEventW(pese->tEdit, ptsev);
  449.         break;
  450.     }
  451.     GMAPage(lastAP);
  452.     GMForeColor(lastFC);
  453.     GMBackColor(lastBC);
  454.     GMFontKind(lastFK);
  455.     setClip(pese->windowPtr, &pese->rcFrame);
  456.  
  457.     return num;
  458. }
  459.  
  460. /******************************************************************************
  461.  *    getEseVal():    日付の取得
  462.  ******************************************************************************
  463.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  464.  *        int *data    値を格納するポインタ
  465.  *        int mode    取得する項目
  466.  *                =  0: 月
  467.  *                =  1: 日
  468.  *    戻り値:    int        <  0: 取得失敗
  469.  *                >= 0: 取得成功
  470.  */
  471. int getEseVal(EseDlg *pese, int *data, int mode)
  472. {
  473.     int len, fields;
  474.     char str[16];
  475.  
  476.     len = TMGetText(pese->tEdit, str, 3);
  477.     str[len] = 0;
  478.     /* 数値に変換 */
  479.     fields = sscanf(str, "%d", &pese->value[pese->tmode]);
  480.     if (fields < 1)
  481.         pese->value[pese->tmode] = 0;
  482.     *data = pese->value[mode];
  483.  
  484.     return len;
  485. }
  486.  
  487. /******************************************************************************
  488.  *    setEseVal():    日付の設定
  489.  ******************************************************************************
  490.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  491.  *        int data    日付の値へのポインタ
  492.  *        int mode    設定項目
  493.  *                =  0: 月
  494.  *                =  1: 日
  495.  *    戻り値:    int errCode    <  0: 設定失敗
  496.  *                >= 0: 設定成功
  497.  */
  498. int setEseVal(EseDlg *pese, int data, int mode)
  499. {
  500.     int len, errCode = 0;
  501.     char str[16];
  502.  
  503.     pese->value[mode] = data;    /* 値をワークにコピーする    */
  504.     if (pese->tmode == mode) {
  505.         /* 指定の編集領域が編集中であれば */
  506.         len = sprintf(str, "%3d", data);
  507.         errCode = TMSetText(pese->tEdit, str, len);
  508.     }
  509.     if (pese->visible)
  510.         /* 表示されていればアップデートする */
  511.         addUpdate(pese->windowPtr, &pese->rcDest);
  512.  
  513.     return errCode;
  514. }
  515.  
  516. /******************************************************************************
  517.  *    moveEdit():    入力項目の変更
  518.  ******************************************************************************
  519.  *    引数:    EseDlg *pese    疑似ダイアログレコードへのポインタ
  520.  *        int mode    入力項目
  521.  *                = 0: 月
  522.  *                = 1: 日
  523.  *    注釈:    カーソルを移動して入力項目の変更を行います。
  524.  */
  525. void moveEdit(EseDlg *pese, int mode)
  526. {
  527.     int len, fields;
  528.     char str[16];
  529.  
  530.     if (pese->tmode == mode)
  531.         /* 編集テキストが以前と同じならば */
  532.         return;
  533.  
  534.     TMHide(pese->tEdit);
  535.     /* テキスト用ディスティネーションレクタングルを作成する */
  536.     pese->rcDest = pese->rcText[mode];
  537.     pese->rcDest.d.left += 3;
  538.     pese->rcDest.d.top += 3;
  539.     pese->rcDest.d.right -= 3;
  540.     pese->rcDest.d.bottom -= 3;
  541.     /* テキスト編集のレクタングルを再設定する */
  542.     TMSetRect(pese->tEdit, &pese->rcDest, &pese->rcDest);
  543.     len = TMGetText(pese->tEdit, str, 3); /* 編集文字列を待避する    */
  544.     str[len] = 0;
  545.     fields = sscanf(str, "%d", &pese->value[pese->tmode]);
  546.     if (fields < 1)
  547.         pese->value[pese->tmode] = 0;
  548.     /* 移動先のテキストに文字列を設定する */
  549.     len = sprintf(str, "%3d", pese->value[mode]);
  550.     TMSetText(pese->tEdit, str, len);
  551.     pese->tmode = mode;
  552.     TMShow(pese->tEdit);
  553.     TMSetSelect(pese->tEdit, 0, (*pese->tEdit)->length, 0);
  554.     if (pese->visible) {
  555.         /* 表示されていればアップデートする */
  556.         addUpdate(pese->windowPtr, &pese->rcText[0]);
  557.         addUpdate(pese->windowPtr, &pese->rcText[1]);
  558.     }
  559. }
  560.  
  561. /******************************************************************************
  562.  *    setClip():    クリッピングの設定
  563.  ******************************************************************************
  564.  *    引数:    Window *winPtr    ウィンドウポインタ
  565.  *        Rect *prect    レクタングルへのポインタ
  566.  */
  567. void setClip(Window *winPtr, Rect *prc)
  568. {
  569.     Region **rgnHdl;
  570.  
  571.     rgnHdl = GMNewRgn();
  572.     if (rgnHdl == NULL) {
  573.         DMError(D_CONFIRM, "メモリが確保できません。");
  574.         return;
  575.     }
  576.     GMRectRgn(rgnHdl, &winPtr->graph.rect);
  577.     GMDiffRectRgn(rgnHdl, rgnHdl, prc);
  578.     GMSetClip(rgnHdl);
  579.     GMDisposeRgn(rgnHdl);        /* リージョンハンドルを解放する    */
  580. }
  581.  
  582. /******************************************************************************
  583.  *    releaseClip():    クリッピングの解除
  584.  ******************************************************************************
  585.  *    引数:    Window *winPtr    ウィンドウポインタ
  586.  */
  587. void releaseClip(Window *winPtr)
  588. {
  589.     GMClipRect(&winPtr->graph.rect);
  590. }
  591.